From: Matthias Springer Date: Mon, 15 May 2023 13:39:35 +0000 (+0200) Subject: [PATCH] [mlir][scf][bufferize] Fix bug in WhileOp analysis verification X-Git-Tag: archive/raspbian/1%15.0.7-10+rpi1~1^2~4 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=aabcc71356b12ff888c05083b55cb1c6c2637450;p=llvm-toolchain-15.git [PATCH] [mlir][scf][bufferize] Fix bug in WhileOp analysis verification Block arguments and yielded values are not equivalent if there are not enough block arguments. This fixes #59442. Differential Revision: https://reviews.llvm.org/D145575 Gbp-Pq: Name CVE-2023-29933.patch --- diff --git a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp index 9459640dad..13f40aa579 100644 --- a/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp +++ b/mlir/lib/Dialect/SCF/Transforms/BufferizableOpInterfaceImpl.cpp @@ -823,10 +823,12 @@ struct WhileOpInterface auto conditionOp = whileOp.getConditionOp(); for (const auto &it : llvm::enumerate(conditionOp.getArgs())) { + Block *block = conditionOp->getBlock(); if (!it.value().getType().isa()) continue; - if (!state.areEquivalentBufferizedValues( - it.value(), conditionOp->getBlock()->getArgument(it.index()))) + if (it.index() >= block->getNumArguments() || + !state.areEquivalentBufferizedValues(it.value(), + block->getArgument(it.index()))) return conditionOp->emitError() << "Condition arg #" << it.index() << " is not equivalent to the corresponding iter bbArg"; @@ -834,10 +836,12 @@ struct WhileOpInterface auto yieldOp = whileOp.getYieldOp(); for (const auto &it : llvm::enumerate(yieldOp.getResults())) { + Block *block = yieldOp->getBlock(); if (!it.value().getType().isa()) continue; - if (!state.areEquivalentBufferizedValues( - it.value(), yieldOp->getBlock()->getArgument(it.index()))) + if (it.index() >= block->getNumArguments() || + !state.areEquivalentBufferizedValues(it.value(), + block->getArgument(it.index()))) return yieldOp->emitError() << "Yield operand #" << it.index() << " is not equivalent to the corresponding iter bbArg"; diff --git a/mlir/test/Dialect/Bufferization/Transforms/one-shot-module-bufferize-invalid.mlir b/mlir/test/Dialect/Bufferization/Transforms/one-shot-module-bufferize-invalid.mlir index 140f67b7c3..a4d2818e91 100644 --- a/mlir/test/Dialect/Bufferization/Transforms/one-shot-module-bufferize-invalid.mlir +++ b/mlir/test/Dialect/Bufferization/Transforms/one-shot-module-bufferize-invalid.mlir @@ -314,3 +314,17 @@ func.func @destination_passing_style_dominance_test_2(%cst : f32, %idx : index, %r = tensor.extract %2[%idx2] : tensor return %r : f32 } + +// ----- + +func.func @regression_scf_while() { + %false = arith.constant false + %8 = bufferization.alloc_tensor() : tensor<10x10xf32> + scf.while (%arg0 = %8) : (tensor<10x10xf32>) -> () { + scf.condition(%false) + } do { + // expected-error @+1 {{Yield operand #0 is not equivalent to the corresponding iter bbArg}} + scf.yield %8 : tensor<10x10xf32> + } + return +}